Computer memory is often allocated among multiple memory pools or components, which are portions or ranges of memory, e.g., blocks, used to satisfy different classes of memory allocation requests. The size of each of the memory pools is typically controlled by and managed through use of separate memory parameters.
With some approaches to memory management, a management system may specify static default values for the sizes of each memory pool based on certain heuristics, such as allocate 20% of the available total shared memory to memory pool X, etc.). With other approaches to memory management, a system administrator is responsible for manually sizing memory pools. Any attempt to optimize such sizing typically involves an iterative process of trial and error, and is a difficult task because the different memory pools are used for different purposes. Optimal allocation of memory among the pools is a real-time function of the type of workload that is occurring on a given application(s) that is using the memory. Hence, an optimal allocation of memory varies, based on time of day, geographic location, etc.
For example, a database server may employ several memory pools, such as a first pool for use when performing backup jobs, and a second pool used for on-line transaction processing (OLTP) activities. If a system is configured with a first pool to accommodate a nightly recovery management backup job, most of this memory, which could have been better utilized by the second pool for OLTP activity, remains unused for the majority of the day. On the other hand, if such backup jobs are not performed or are not completed because the first pool is set too small, then the cost of failures could be prohibitive from a business point of view, leaving administrators with few other options.
In practice, an administrator sets the memory allocation parameters for a given application or cluster of applications, and such allocation is infrequently revisited, if at all. Undersized pools could lead to application failures due to failure to allocate sufficient memory to given pools, and to performance problems arising from the need to reload data or perform excessive disk I/O. Hence, memory pool allocations are commonly oversized to handle the worst scenarios while attempting to avoid system errors, and with the goal of avoiding the need for reallocation. For example, some types of pools are often oversized to prevent application errors, at detriment to the performance of other pools.
Based on the foregoing, there is a general need for a technique for managing memory that is allocated among multiple memory pools that does not result in the inefficiencies described above.